HNU2000 - Session 2

Les expressions régulières pour manipuler le texte, dans l’éditeur Sublime Text

Sublime Text

  • https://www.sublimetext.com/
  • éditeur de texte simple mais puissant
  • types de fichiers texte supportés
  • coloration syntaxique
  • rechercher et remplacer (Ctrl + H)

Données textuelles

Rapport de santé publique des Etats Unis pour l’année 1908.

Statistical Reports of Morbidity and Mortality, States and Cities of the United States: Untabulated (1908)

Prenons le temps de regarder le document et la structure des données

Accès au texte brut

On travaille avec le résultat de la transcription automatique du document.

Notre objectif: transformer ce texte en données tabulaires

pour pouvoir :

  • visualiser les données
  • effectuer des calculs
  • re-publier ces données dans un format interactif

Comma Separated Values (CSV)

  • lisible comme du texte simple
  • interprété par Excel, Sheets et Calc comme un tableau
  • chaque ligne de texte = ligne du tableau
  • les colonnes sont marquées par un caractère de séparation:
    • ,
    • \t” (tabulation)
    • ;” (par défault dans Excel)

Tableau “parsé”

colonne A colonne B
ligne 1 cellule i cellule ii
ligne 2 cellule iii cellule iv

La même chose en CSV non parsé

(csv)

,colonne A,colonne B
ligne 1,cellule i,cellule ii
ligne 2,cellule iii,cellule iv
,,,

(tsv)

    colonne A   colonne B
ligne 1 cellule i  cellule ii
ligne 2 cellule iii cellule iv

Etapes

  • copier le texte et coller dans un nouveau fichier dans Sublime Text
  • nettoyer le texte
    • supprimer l’en-tête générée par JSTOR
    • retirer “"” (2 matches)
  • utiliser les expressions régulières pour rendre visible la structure des données

Retrouver la struture logique

  • remplacer les sauts de lignes par un caractère temporaire (“\n” → “#”)
  • résoudre les hyphénations : (“- #” → “ ”)
  • recréer les paragraphes (“##” → “”, puis “#” → “ ”)
  • retirer les espaces doubles: “ {2,}” “ 

Quelle structure souhaitons-nous ?

Illinois — Alton. — Month of January, 1908. Estimated populations, 20,000. Total number of deaths, 15, including 4 from tuberculosis. Cases: Diphtheria 1. 
Evanston. — Year ended December 31, 1907. Estimated population, 23,000. Total number of deaths, 268, including diphtheria 3, enteric fever 5, measles 1, whooping cough 4, and scarlet fever 4. Cases: Diphtheria 19, measles 128, scarlet fever 279, smallpox 2, and whooping cough 35. 
Indiana. — Month of December, 1907. Estimated population, 2,648,594. Total number of deaths, 2,768, corresponding to an annual death rate of 12.1 per 1,000 of population, including 29 from diphtheria, 69 from enteric fever, 9 from measles, 8 from scarlet fever, 7 from whooping cough, and 315 from tuberculosis. 
Morbidity : Diphtheria, 340 cases in 44 counties ; enteric fever, 318 cases in 47 counties ; smallpox, 218 cases in 19 counties. 
Jefersonville. — Month of August, 1907. Estimated population, 10,840. Total number of deaths, 19, including 1 from tuberculosis. Cases: Enteric fever 10, diphtheria 1, and tuberculosis 2. 
Month of September, 1907. Total number of deaths, 24, including 6 from tuberculosis. 
Month of October, 1907. Total number of deaths, 8, including enteric fever 1, and 1 from tuberculosis. Cases: Diphtheria 3, enteric fever 3, and tuberculosis 1. 
Month of November, 1907. Total number of deaths, 17, including enteric fever 2, and 2 from tuberculosis. Cases: Diphtheria 3, enteric fever 1, and tuberculosis 2. 
Month of January, 1908. Total number of deaths not reported. One death from enteric fever and 2 from tuberculosis reported. Cases: Enteric fever 1 and tuberculosis 2. 
Marion. — Month of January, 1908. Estimated population, 27,000. Total number of deaths, 20, including 2 from tuberculosis. Cases: Scarlet fever 1, diphtheria 1, smallpox 4, and tuberculosis 1. 
Muncie. — Month ended February 4, 1908. Estimated population, 34,036. Total number of deaths, 23, including 2 from tuberculosis. Cases : Enteric fever 1, smallpox 1, and whooping cough 4. 
Iowa. — Cedar Rapids. — Month of January, 1908. Estimated population, 30,000. Total number of deaths, 39, including enteric fever 2, scarlet fever 2, and 3 from tuberculosis. Cases: Scarlet fever 18, smallpox 4, and diphtheria 2. 
Davenport. — Month of January, 1908. Estimated population, 40,000. Total number of deaths not reported. One death from diphtheria and 2 from enteric fever. Cases: Diphtheria 17, enteric fever 5, measles 2, scarlet fever 2, smallpox 1, whooping cough 2, and tuberculosis 1. 
For month of December, 1907, see Public Health Reports, January 17, 1908. 

Repérer des patterns

Total number of deaths\tTotal number of deaths

Expressions régulières

  • \n
  • \t
  • {2,}

Ces notations appartiennent au domaine des expressions régulières

Le but des REGEX est de trouver des motifs dans le texte

  • littéraux : fever
  • ensembles : [fevr]
  • intervalles : [a-z]
  • classes : \w, \d
  • caractères spéciaux : ., ?, ^
  • quantifieurs : {2}, +

Month .+?\d{4}

^.*February 21.*1908.*$ (rien) ^.*Received out of regular order..*$ (rien)

Explications sur certains caractères spéciaux: - ^ (accent circonflexe) correspond au début de la ligne. - . (point) correspond à n’importe quel caractère. - * (astérisque) correspond à toute séquence de zéro caractère ou plus. - $ (le symbole dollar) correspond à la fin de la ligne.

  • \n{2,}\n

Explications sur les quantifieurs: - {4} : strictement 4 fois - {1,5} : entre 1 et 5 fois - {2,} : au moins deux fois

  • ?— ?\t

même chose que ( )?—( )? ou [ ]?—[ ]?

Explication différence entre littéral, groupes et intervalle.

  • (Month of [A-Z][a-z, 0-9]+ 19[0-9][0-9].)<t>$1</t>

  • () = capture

  • $1 = remplacement

  • <t></t> un pseudo balisage temporaire pour faciliter la structuration du texte, ici <t> note les informations de temps

  • attention à n’appliquer la regex qu’une seule fois, sinon on va avoir plusieurs <t></t> imbriqués

plus tard, on va utiliser d’autres lettre: - <p> pour les estimations de population - <N> pour les nombres totaux de décès - <c> pour “Cases” (cas)

([-A-Za-z ]+ ended [A-Z][a-z, 0-9]+ 19[0-9][0-9].)<t>$1</t>

Même chose mais pour les rapports trimestriels (noter qu’avec cette technique, on est flexible face aux erreurs d’OCR).

(Estimated population, [0-9,]+.)<p>$1</p> (Total number of deaths[A-Za-z ,]* [0-9,]+)<N>$1</N> (Cases ?:)<c>$1</c>

  • décrire ce qu’il s’est passé et ce qu’on est en train de faire
  • lisons ensemble les expressions utilisées

On va ensuite repérer les maladies et le décompte de cas pour chacune d’elles

</N> including ([A-Za-z ]+) ([0-9]+),</N> including <d>$1</d> <n>$2</n>

> ([A-Za-z ]+) ([0-9]+)([.,])> <d>$1</d> <n>$2</n> (à répéter jusqu’à ce qu’il n’y ait plus de match)

and ([0-9])+ from ([a-z ]+)<d>$2</d> <n>$1</n>

(point sur les infos sémantiques qui sont identifiées) - + questions ?

Reprenons la question de la localisation: pour le moment, on sépare les données avec une tabulation, parce que c’est plus facile à repérer

^([A-Za-z .]+\t<t>)\t$1 ^<t>\t\t<t>

Explication : on rajoute une tabulation lorsqu’on ne connaît pas l’Etat dans lequel se situe la ville.

Possible de faire un collage spécial dans CALC pour montrer la différence avant/après

(Il y a un cas, pour l’Indiana, où le texte indique cette section avec le terme “Morbidity”. Notre motif de recherche l’a manqué. Vous pouvez réparer le balisage à la main à présent, si vous le souhaitez, ou bien l’ignorer puisqu’il s’agit ici d’un exercice.)

^(.*\t)(.*\t)(<t>.*</t>)(.*)(<c>.*)$1$2$3$4\n$1$2$3\t$5

^(.*\t)(.*\t)(<t>.*</t>)(.*<c>.*)(<d>.*</d>) (<n>.*</n>)$1$2$3$4\n$1$2$3\tCases\t$5$6 (répéter)

^(.*\t)(.*\t)(<t>.*</t>)(.*<N>.*)(<d>.*</d>) (<n>.*</n>)$1$2$3$4\n$1$2$3\tDeaths\t$5$6 (répéter)

On voit clairement la structure tabulaire se dessiner

On nettoie ensuite les données pour retirer les traces du pseudo balisage

  • .*</c> $ → `` (rien)
  • \n{2,}\n
  • <n>\t
  • </n> → `` (rien)
  • <d>and<d>
  • </?[tdp]> → `` (rien)

On a 1 TSV, faisons un vrai CSV

  • ^\t"",
  • \t","
  • \n"\n

Collage spécial dans Calc (UTF-8, séparateur et caractère d’échappement)

enregistrer sous “.csv”

  • ouvrons ça dans Google Sheet

Injecter tout dans Calc - voir que certaines lignes n’ont pas été formatées comme les autres - il reste donc des correspondances à faire à la main

Debriefons

  • Les expressions régulières vous semblent-elles utiles ?
  • Les expressions régulières vous semblent-elles compliquées à utiliser ?
  • Voyez-vous d’autres cas d’application immédiats ?

  • https://regexcrossword.com/